import json
import os
from typing import Dict, Any, Optional

class SimpleDB:
    """
    简单的键值存储数据库
    功能：
    - 创建/更新数据
    - 读取数据
    - 删除数据
    - 数据持久化到文件
    - 从文件加载数据
    """
    
    def __init__(self, db_file: str = 'simple_db.json'):
        """
        初始化数据库
        
        :param db_file: 数据库文件路径
        """
        self.db_file = db_file
        self.data: Dict[str, Any] = {}
        self._load()
    
    def _load(self) -> None:
        """从文件加载数据"""
        if os.path.exists(self.db_file):
            with open(self.db_file, 'r') as f:
                self.data = json.load(f)
    
    def _save(self) -> None:
        """保存数据到文件"""
        with open(self.db_file, 'w') as f:
            json.dump(self.data, f, indent=2)
    
    def set(self, key: str, value: Any) -> None:
        """
        设置键值对
        
        :param key: 键
        :param value: 值
        """
        self.data[key] = value
        self._save()
    
    def get(self, key: str) -> Optional[Any]:
        """
        获取键对应的值
        
        :param key: 键
        :return: 值，如果键不存在则返回None
        """
        return self.data.get(key)
    
    def delete(self, key: str) -> bool:
        """
        删除键值对
        
        :param key: 键
        :return: 是否删除成功
        """
        if key in self.data:
            del self.data[key]
            self._save()
            return True
        return False
    
    def keys(self) -> list:
        """获取所有键"""
        return list(self.data.keys())
    
    def values(self) -> list:
        """获取所有值"""
        return list(self.data.values())
    
    def items(self) -> list:
        """获取所有键值对"""
        return list(self.data.items())
    
    def clear(self) -> None:
        """清空数据库"""
        self.data.clear()
        self._save()
    
    def __contains__(self, key: str) -> bool:
        """检查键是否存在"""
        return key in self.data
    
    def __len__(self) -> int:
        """获取数据库大小"""
        return len(self.data)
    
    
if __name__ == "__main__":
    # 创建数据库实例
    db = SimpleDB('my_database.json')

    # 添加数据
    db.set('name', 'Alice')
    db.set('age', 30)
    db.set('skills', ['Python', 'SQL', 'JavaScript'])

    # 获取数据
    print(db.get('name'))  # 输出: Alice
    print(db.get('age'))   # 输出: 30

    # 检查键是否存在
    print('age' in db)     # 输出: True
    print('address' in db) # 输出: False

    # 删除数据
    db.delete('age')
    print(db.get('age'))   # 输出: None

    # 获取所有键值对
    print(db.items())

    # 清空数据库
    db.clear()
